package igor.lakienko.ru.generation.quotes.service;

import igor.lakienko.ru.generation.quotes.dto.CryptocurrencyDto;
import igor.lakienko.ru.generation.quotes.dto.CurrencyDto;
import igor.lakienko.ru.generation.quotes.dto.MessageEventDto;
import igor.lakienko.ru.generation.quotes.dto.PreciousMetalDto;
import igor.lakienko.ru.generation.quotes.dto.StockDto;
import lombok.RequiredArgsConstructor;
import lombok.Setter;
import lombok.extern.log4j.Log4j2;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.List;

/**
 * Композитный сервис для получения всех котировок и транслирования их в разные системы.
 */
@Log4j2
@Service
@RequiredArgsConstructor
public class CompositeQuoteService {

    @Setter
    @Value("${quote.isQuoteEnabled}")
    public static boolean isQuoteEnabled;

    private final StockService stockService;

    private final CryptocurrencyService cryptocurrencyService;

    private final PreciousMetalService preciousMetalService;

    private final CurrencyService currencyService;

    public String getQuote() {
        ArrayList<MessageEventDto> stocks = new ArrayList<>();
        while (isQuoteEnabled) {
            MessageEventDto stock = stockService.getStock();
            MessageEventDto cryptocurrency = cryptocurrencyService.getCryptocurrency();
            MessageEventDto metal = preciousMetalService.getMetal();
            MessageEventDto currency = currencyService.getCurrency();
            log.info("Котировки получены: {}: {}: {}: {}", stock, cryptocurrency, metal, currency);
            stocks.addAll(List.of(stock, cryptocurrency, metal, currency));

            if (stocks.size() == 10000) {
                return "Поток котировок приостановлен";
            }
        }

        String result = "Поток котировок приостановлен, количество котировок которое было сгенерировано: "
                + stocks.size() + ", список всех котировок: " + stocks;
        return ResponseEntity.ok(result).getBody();
    }

    public String getQuotes() {
        ArrayList<MessageEventDto> quotes = new ArrayList<>();
        Collection<StockDto> stocks = stockService.getStocks();
        Collection<CryptocurrencyDto> cryptocurrencies = cryptocurrencyService.getCryptocurrencies();
        Collection<PreciousMetalDto> metals = preciousMetalService.getMetals();
        Collection<CurrencyDto> currencies = currencyService.getCurrencies();
        quotes.addAll(stocks);
        quotes.addAll(cryptocurrencies);
        quotes.addAll(metals);
        quotes.addAll(currencies);
        Collections.shuffle(quotes);
        String result = "Размер котировок: " + quotes.size() + ", список котировок:" + quotes;
        log.info(result);
        return ResponseEntity.ok(result).getBody();
    }

    public static void quoteEnabled(boolean isQuoteEnabled) {
        setQuoteEnabled(isQuoteEnabled);
    }

}
